#Cria um objeto simulador
set ns [new Simulator]
#Cria um ponteiro para o arquivo out.nam
set nf [open out.nam w]

#Indica para o simulador que os dados da simulação devem ser escritos no arquivo
#apontado por nf
$ns namtrace-all $nf
#Escolha de um protocolo de roteamento dinâmico por vetor de distância
$ns rtproto DV

#Procedimento responsável por finalizar o arquivo de trace e iniciar o nam
proc finish {} {
    #Variáveis ns e nf são globais e podem ser modificadas dentro do método
    global ns nf
    #Realiza o flush dos buffers de escrita no arquivo
    $ns flush-trace
    #Fecha o arquivo
    close $nf
    #Executa o nam em background, passando como argumento o arquivo gerado pela
    #simulação
    exec nam out.nam &
    exit 0
}

#Criando 7 nós usando um vetor
for {set i 0} {$i < 7} {incr i} {
    set n($i) [$ns node]
}

#Criando 7 enlaces que conectam os nós ao seus sucessores (o sucessor de 6 é 0)
for {set i 0} {$i < 7} {incr i} {
    $ns duplex-link $n($i) $n([expr ($i+1)%7]) 1Mb 10ms DropTail
}

#Criando um Agente UDP
set udp0 [new Agent/UDP]
#Associando o agente udp ao nó 0
$ns attach-agent $n(0) $udp0
#Associa o Agente UDP ao número 1 (usado para modificar a cor)
$udp0 set class_ 1

#Criando um tráfego CBR(Constant Bit Rate)
set cbr0 [new Application/Traffic/CBR]
#Pacotes com tamanho de 500 bytes
$cbr0 set packetSize_ 500
#Pacotes são enviados a cada 5 ms, totalizando 200 pacotes por segundo
$cbr0 set interval_ 0.005
#Associa o tráfego CBR ao Agente UDP
$cbr0 attach-agent $udp0

#Cria um Agente Null (sumidouro de pacotes)
set null0 [new Agent/Null]
#Associao ao nó 3
$ns attach-agent $n(3) $null0

#Conecta os Agentes UDP e NULL, indicando que o tráfego iniciará em n(0) e terminará em
#n(3)
$ns connect $udp0 $null0

#Muda a cor dos pacotes UDP enviados para azul
$ns color 1 Blue

#Início do tráfego CBR em 0.5s
$ns at 0.5 "$cbr0 start"
#Término do tráfego CBR em 4.5s
$ns at 4.5 "$cbr0 stop"

#Falha no enlace entre n0 e n1
$ns rtmodel-at 1.0 down $n(1) $n(2)
#Recuperação do enlace
$ns rtmodel-at 2.0 up $n(1) $n(2)

#Diz ao simulador para executar o processo finish depois de 5 segundos (finaliza a
#simulação)
$ns at 5.0 "finish"
#Roda a simulação
$ns run

